package com.guli.pay.controller;

import com.github.wxpay.sdk.WXPayUtil;

import com.guli.pay.service.WXPayService;

import com.guli.pay.until.IdWorker;
import com.guli.pay.until.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("alipay")
public class WXPayController {
   @Autowired
    WXPayService wxPayService;


@Autowired
IdWorker idWorker;


@PostMapping("genWorkerId")
public Result genWorkerId() {
    return new Result(true,"1",String.valueOf(idWorker.nextId()));
}


    /**4
     * 封装 微信支付统一一下接口
     * @param orderId
     * @param totalFee
     * @param body
     * @return
     * @throws Exception
     */
    @PostMapping("unifiedOrder/{orderId}/{totalFee}/{body}")
    public Result unifiedOrder(@PathVariable Long orderId,
                               @PathVariable Integer totalFee,
                               @PathVariable String body
                               ) throws Exception {
    return wxPayService.unifiedOrder(orderId,totalFee,body);
}


    /**
     * 封装 微信支付的订单查询
     * @param orderId
     * @return
     */
    @PostMapping("orderQuery/{orderId}")
    public Result orderQuery(@PathVariable Long orderId) throws Exception {
        return wxPayService.orderQuery(orderId);
}


    /**
     * 支付完成后，微信会把相关支付结果及用户信息通过数据流的形式发送给商户，商户需要接收处理，并按文档规范返回应答。
     *
     * 注意：
     * 1、同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
     *
     * 2、后台通知交互时，如果微信收到商户的应答不符合规范或超时，微信会判定本次通知失败，重新发送通知，
     * 直到成功为止（在通知一直不成功的情况下，微信总共会发起多次通知，
     * 通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m）
     * 这里通知发送可能会多台服务器进行发送，且发送时间可能会在几秒内，但微信不保证通知最终一定能成功。
     * 3、在订单状态不明或者没有收到微信支付结果通知的情况下，建议商户主动调用微信支付【查询订单API】确认订单状态。
     */
@Autowired
    HttpServletRequest request;

@Autowired
HttpServletResponse response;


@PostMapping("notify_url")
    public void notify_url() throws Exception {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    System.out.println("wx notify:"+simpleDateFormat.format(new Date()));
    String header = request.getHeader("Content-Type");
    System.out.println(header);
    BufferedReader reader = request.getReader();
    StringBuilder stringBuilder = new StringBuilder();
    reader.lines().forEach((line)->{
        stringBuilder.append(line);
    });
   String requestBodyXML= stringBuilder.toString();
    System.out.println(requestBodyXML);
    Map<String, String> stringStringMap = WXPayUtil.xmlToMap(requestBodyXML);
    String return_code = stringStringMap.get("return_code");
    if(return_code.equalsIgnoreCase("SUCCESS")){
        String result_code = stringStringMap.get("result_code");
        String out_trade_no = stringStringMap.get("out_trade_no");
        String total_fee = stringStringMap.get("total_fee");


        System.out.println("out_trade_no="+out_trade_no);
        System.out.println("total_fee"+total_fee);
        PrintWriter writer = response.getWriter();
        Map responseMap=new HashMap();
        responseMap.put("return_code","SUCCESS");
        responseMap.put("return_msg","OK");
        String responseXML = WXPayUtil.mapToXml(responseMap);

        writer.write(responseXML);
    }


}

}
